﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.SqlClient;
using Entidad;

namespace DAO
{
    public class LibroQueryDAO : ABMCLibroInterface
    {
        private DAO_v2 dao;

        public LibroQueryDAO()
        {
            dao = new DAO_v2();
        }

        public List<LibroQueryEnt> BuscarTodosLibrosQuery(String[] filtros)
        {
            SqlConnection cn = new SqlConnection(DAO_v2.MiCadenaConexion());
            try
            {
                cn.Open();
                String consulta = "SELECT ";
                consulta += "l.id_Libro AS id_Libro, l.isbn AS ISBN, l.titulo AS Titulo, l.cantHojas AS CantidadHojas, l.fechaEmision AS FechaEmision, l.precioNuevo AS PrecioNuevo, ";
                consulta += "m.nombre AS Materia, ";
                consulta += "c.nombre AS Carrera, ";
                consulta += "e.nombre AS Editorial ";
                consulta += "FROM ";
                consulta += "Libro l ";
                consulta += "LEFT JOIN Materia m ON m.id_Materia = l.id_Materia ";
                consulta += "LEFT JOIN Editorial e ON e.id_Editorial = l.id_Editorial ";
                consulta += "LEFT JOIN Carrera c ON c.id_Carrera = m.id_Carrera ";
                consulta += "WHERE 1 = 1";
                if (filtros != null)
                {
                    foreach (String filtro in filtros)
                    {
                        consulta += " AND " + filtro;
                    }
                }
                List<LibroQueryEnt> resultado = new List<LibroQueryEnt>();
                SqlCommand cmd = new SqlCommand();
                cmd.CommandText = consulta;
                cmd.Connection = cn;
                SqlDataReader dr = cmd.ExecuteReader();
                while (dr.Read())
                {
                    LibroQueryEnt libroQuery = new LibroQueryEnt();
                    libroQuery.IDLibro = int.Parse(dr["id_Libro"].ToString());
                    libroQuery.ISBN = Int64.Parse(dr["ISBN"].ToString());
                    libroQuery.Titulo = dr["Titulo"].ToString();
                    libroQuery.CantidadHojas = int.Parse(dr["CantidadHojas"].ToString());
                    libroQuery.FechaEmision = DateTime.Parse(dr["FechaEmision"].ToString());
                    if (dr["PrecioNuevo"] != DBNull.Value)
                    {
                        libroQuery.PrecioNuevo = double.Parse(dr["PrecioNuevo"].ToString());
                    }
                    else
                    {
                        libroQuery.PrecioNuevo = null;
                    }
                    libroQuery.MateriaNombre = dr["Materia"].ToString();
                    libroQuery.EditorialNombre = dr["Editorial"].ToString();
                    libroQuery.CarreraNombre = dr["Carrera"].ToString();

                    resultado.Add(libroQuery);
                }
                return resultado;
            }
            catch(SqlException ex)
            {
                return null;
                throw new ApplicationException("Error al obtener todos los libros detallados..."); 
            }
            finally
            {
                dao.CerrarConexion(cn);
            }
        }

        public void GuardarLibro(Entidad.LibroEnt libro)
        {
            throw new NotImplementedException();
        }

        public Entidad.LibroEnt BuscarLibro(Int64 ISBN)
        {
            throw new NotImplementedException();
        }

        public List<Entidad.LibroEnt> ObtenerTodosLibros()
        {
            throw new NotImplementedException();
        }

        public void ActualizarLibro(Entidad.LibroEnt libro)
        {
            throw new NotImplementedException();
        }



        public bool EliminarLibro(int IDLibro)
        {
            throw new NotImplementedException();
        }


        public LibroEnt BuscarLibroISBN(Int64 ISBN)
        {
            throw new NotImplementedException();
        }


        System.Data.DataView ABMCLibroInterface.ObtenerTodasEditoriales()
        {
            throw new NotImplementedException();
        }


        public System.Data.DataView ObtenerTodasMaterias()
        {
            throw new NotImplementedException();
        }
    }
}
